package com.ncr.teradata.bireport;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;

/**
 * DBUpdate.java
 * 数据库更新类
 *
 * @author ylpeng
 * @date Dec 20, 2006
 *
 * @modify date,auther,desc
 */
public class DBUpdate
{
	/**
	 *执行数据库更新语句
	 *
	 *@param sql String 需要执行的SQL语句
	 *@return int 数据库更新受影响的行数
	 */
	public int execute(String sql){
		Connection conn = DBFactory.getConnection();
		int rowCnt = 0;
		try{
			Statement stmt = conn.createStatement();
			rowCnt = stmt.executeUpdate(sql);
			stmt.close();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			DBFactory.close(conn);
		}
		return rowCnt;
	}
	
	/**
	 *执行数据库更新语句
	 *
	 *@param sql String 需要执行的SQL语句（带有问号）
	 *@param params String[] 用该数组里的字符串来替换SQL语句中的问号
	 *@return int 数据库更新受影响的行数
	 */
	public int execute(String sql,String[] params){
		Connection conn = DBFactory.getConnection();
		int rowCnt = 0;
		try{
			PreparedStatement stmt = conn.prepareStatement(sql);
			for(int i = 1; i <= params.length; i++){
				stmt.setString(i, params[i - 1]);
			}
			rowCnt = stmt.executeUpdate();
			stmt.close();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			DBFactory.close(conn);
		}
		return rowCnt;
	}
	
	/**
	 *批量执行数据库更新语句
	 *
	 *@param sqlarr String[] 需要执行的SQL语句数组
	 *@return int[] 数组中的每一句SQL更新受影响的行数
	 */
	public int[] executeBatch(String[] sqlarr){
		Connection conn = DBFactory.getConnection();
		int[] rowCnts = null;
		try{
			Statement stmt = conn.createStatement();
			for(int i = 0; i < sqlarr.length; i++)
				stmt.addBatch(sqlarr[i]);
			rowCnts = stmt.executeBatch();
			stmt.clearBatch();
			stmt.close();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			DBFactory.close(conn);
		}
		return rowCnts == null ? new int[]{0} : rowCnts;
	}
	
	/**
	 *批量执行数据库更新语句
	 *
	 *@param sql String 需要执行的SQL语句，各句之间用分号";"隔开
	 *@return int[] 分解后的每一句SQL更新受影响的行数
	 */
	public int[] executeBatch(String sql){
		Connection conn = DBFactory.getConnection();
		String[] sqlarr = sql.split(";");
		int[] rowCnts = null;
		try{
			Statement stmt = conn.createStatement();
			for(int i = 0; i < sqlarr.length; i++)
				stmt.addBatch(sqlarr[i]);
			rowCnts = stmt.executeBatch();
			stmt.clearBatch();
			stmt.close();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		finally{
			DBFactory.close(conn);
		}
		return rowCnts == null ? new int[]{0} : rowCnts;
	}
}